package com.uidp.security;

import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.servlet.http.HttpServletRequest;

/**
 * Филтър за страници и потребители в приложението.
 * 
 */
public class SecurityUserFilter extends AccessFilter implements PhaseListener {

	private static final String DATA = "THE_DATA";

	/** Сериен номер на класа. */
	private static final long serialVersionUID = -4158834693933713220L;

	/**
	 * Проверява дали страницата е позволена за текущия потребител. Ако тя не е
	 * разрешена или потребителя не е логнат успешно, то се препраща към login
	 * формата.
	 * 
	 * @see javax.faces.event.PhaseListener#afterPhase(javax.faces.event.PhaseEvent)
	 */
	public void afterPhase(PhaseEvent arg0) {
		HttpServletRequest req = (HttpServletRequest) arg0.getFacesContext().getExternalContext()
				.getRequest();
		Redirect state = (Redirect) req.getAttribute(getClass().getName().concat(DATA));

		if (!state.isOK()) {
			state.redirect(arg0.getFacesContext());
		}
	}

	/**
	 * @see javax.faces.event.PhaseListener#beforePhase(javax.faces.event.PhaseEvent)
	 */
	public void beforePhase(PhaseEvent arg0) {
		// нищо не правим, че така или иначе и преди действието е в след фазата
		Redirect state = check(arg0);

		HttpServletRequest req = (HttpServletRequest) arg0.getFacesContext().getExternalContext()
				.getRequest();
		req.setAttribute(getClass().getName().concat(DATA), state);
	}

	/**
	 * Фазата на извикване на бизнес слоя.
	 * 
	 * @see javax.faces.event.PhaseListener#getPhaseId()
	 */
	public PhaseId getPhaseId() {
		return PhaseId.RESTORE_VIEW;
	}
}